#include "ReproductorWav.h"
#include <iostream>
#include <string>
#include "Log.h"
#include <map>

bool ReproductorWav::iniciado = false;
unsigned int ReproductorWav::canal = 0;

ReproductorWav::ReproductorWav() {

    ReproductorWav::iniciar();

    this->canal_id=ReproductorWav::canal;

    if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 6000) == -1) {
         std::stringstream ss;
         ss << "Error en Mix_OpenAudio: " << Mix_GetError();
         Log::loguear(MERROR, ss.str());
    }
    this->mute=false;
    Mix_AllocateChannels(2);
}

bool ReproductorWav::muteActivado(){
	return this->mute==true;
}

bool ReproductorWav::cambiarMute(){
    if (this->mute==true){
        Log::loguear(MINFO, "Se ha activado el reproductor.");
        this->mute=false;
    } else {
        Log::loguear(MINFO, "Se ha desactivado el reproductor.");
        this->mute=true;
    }
    
    return mute;
}

ReproductorWav::~ReproductorWav() {
    std::map<t_sonido,Mix_Chunk*>::iterator it;
    for (it = this->sonidos.begin(); it != this->sonidos.end(); ++it) {
        Mix_FreeChunk(it->second);
    }
    Mix_CloseAudio();
}

void ReproductorWav::iniciar() {
    if (!ReproductorWav::iniciado) {
        SDL_Init(SDL_INIT_AUDIO);
        ReproductorWav::iniciado = true;
    }

    ReproductorWav::canal++;
}

bool ReproductorWav::addAudio(t_sonido sonido, std::string ruta){
    std::map<t_sonido,Mix_Chunk*>::iterator it;

    Mix_Chunk* actual;
    Mix_Chunk* sound = Mix_LoadWAV(ruta.c_str());

    if (sound!=NULL){
        /* Libera recursos si ya está seteado */
        if ((actual=getAudio(sonido)))
            Mix_FreeChunk(actual);

        this->sonidos[sonido]=sound;
    } else {
        std::stringstream ss;
        ss << "Error cargando archivo WAV: " << Mix_GetError();
        Log::loguear(MERROR, ss.str());
        return false;
    }

return true;
}

bool ReproductorWav::setAudio(t_sonido sonido, std::string ruta){
    if (!addAudio(sonido, ruta)){
        std::stringstream ss;
        ss << "Error seteando archivo WAV: " << Mix_GetError();
        Log::loguear(MERROR, ss.str());
        return false;
    }

return true;
}

Mix_Chunk* ReproductorWav::getAudio(t_sonido sonido){
    std::map<t_sonido,Mix_Chunk*>::iterator it;
    if ((it=this->sonidos.find(sonido)) == this->sonidos.end())
        return NULL;

return it->second;
}

bool ReproductorWav::reproducir(t_sonido sonido) {
    if (this->mute==true){
        Log::loguear(MINFO, "El reproductor esta deshabilitado (mute).");
    } else {
        int channel;
        Mix_Chunk* sound;

        if ((sound=getAudio(sonido))){
           channel =  Mix_PlayChannel(this->canal_id, sound, 0);
           if(channel == -1) {
            std::stringstream ss;
            ss << "Error reproduciendo WAV: " << Mix_GetError();
            Log::loguear(MERROR, ss.str());
            return false;
           } else {
            Log::loguear(MDEBUG, "Se reprodujo sonido.");
           }
        }
    }
return true;
}
